home *** CD-ROM | disk | FTP | other *** search
/ Aminet 24 / Aminet 24 (1998)(GTI - Schatztruhe)[!][Apr 1998].iso / Aminet / dev / lang / PPCsmalltalk.lha / PPCSmallTalk / sources / lexcmd.c < prev    next >
C/C++ Source or Header  |  1998-02-08  |  7KB  |  317 lines

  1. /*
  2.     Little Smalltalk
  3.         misc lexer related routines
  4.         timothy a. budd 12/84
  5. */
  6. /*
  7.     The source code for the Little Smalltalk System may be freely
  8.     copied provided that the source of all files is acknowledged
  9.     and that this condition is copied with each file.
  10.  
  11.     The Little Smalltalk System is distributed without responsibility
  12.     for the performance of the program and without any guarantee of
  13.     maintenance.
  14.  
  15.     All questions concerning Little Smalltalk should be addressed to:
  16.  
  17.         Professor Tim Budd
  18.         Department of Computer Science
  19.         The University of Arizona
  20.         Tucson, Arizona
  21.         85721
  22.         USA
  23. */
  24. # include <stdio.h>
  25. # include "env.h"
  26. # include <ctype.h>
  27.  
  28. extern char toktext[];
  29.  
  30. /* dolexcommand - read a ) type directive, and process it */
  31. dolexcommand(p)
  32. char *p;
  33. {       char *q, buffer[100];
  34.  
  35.     /* replace trailing newline with end of string */
  36.     for (q = p; *q && *q != '\n'; q++);
  37.     if (*q == '\n') *q = '\0';
  38.  
  39.         switch( *++p) {
  40.            case '!': 
  41. # ifndef NOSYSTEM
  42.         system(++p); 
  43. # endif
  44.         break;
  45.  
  46.            case 'e': for (++p; isspace(*p); p++);
  47.              if (! lexedit(p)) lexinclude(p);
  48.                      break;
  49.  
  50.        case 'g': for (++p; isspace(*p); p++);
  51.              sprintf(buffer,"%s/%s", LIBLOC, p);
  52.              lexread(buffer);
  53.              break;
  54.  
  55.            case 'i': for (++p; isspace(*p); p++);
  56.                      lexinclude(p);
  57.                      break;
  58.  
  59.            case 'r': for (++p; isspace(*p); p++);
  60.                      lexread(p);
  61.                      break;
  62.  
  63.        case 's': for(++p; isspace(*p); p++);
  64.              dosave(p);
  65.              break;
  66.  
  67.        case 'l': for(++p; isspace(*p); p++);
  68.              doload(p);
  69.              break;
  70.  
  71.            default:  lexerr("unknown command %s", toktext);
  72.            }
  73. }
  74.  
  75. /* doload/dosave routines written by nick buchholz */
  76. /*
  77.     doload and dosave routines make the following assumptions
  78.     1. version is the first global variable declared in main.
  79.     2. main is the first procedure seen by the loader
  80.     3. the loader allocates memory in the order it sees the procedures
  81.     4. memory is laid out as on the vax 780 under 4.2
  82.  
  83.     on other machines any or all of these might be false and the
  84.     doload/dosave routines will not work
  85. */
  86. extern int version;
  87.  
  88. #ifdef AMIGA
  89.  
  90. dosave(p) char *p;{
  91.     FILE *fd; 
  92.     char *start, *end, *sbrk(); 
  93.     unsigned int length, len;
  94.     int dlen;
  95.  
  96.     if(!(fd = fopen(p, "wb")))
  97.      {
  98.       fprintf(stderr,"can't open: %s\n",p);
  99.       return;
  100.      }
  101.  
  102.     start = (char *) &version;
  103.     end = sbrk(0);
  104.     length = end - start;
  105.  
  106.     fwrite(&version, sizeof(int), 1, fd);
  107.     fwrite(&start,   sizeof(char *), 1, fd);
  108.     fwrite(&length,  sizeof(unsigned int), 1, fd);
  109.  
  110.     for (len = 0; len < length; len += dlen) {
  111.     dlen = ((length - len) > 512) ? 512 : (length - len);
  112.     if (dlen != fwrite(start+len, dlen, 1, fd)) {
  113.         cant_happen(23);
  114.         }
  115.     }
  116.  
  117.     fprintf(stderr,"%u bytes written\n",len);
  118.  
  119.     fclose(fd);
  120. }
  121.  
  122. #else /* AMIGA */
  123.  
  124. dosave(p) char *p;{
  125.     int fd; 
  126.     char *start, *end, *sbrk(); 
  127.     unsigned int length, len;
  128.     int dlen;
  129.  
  130. # ifdef OPEN3ARG
  131.     if ((fd = open(p, O_WRONLY|O_CREAT|O_TRUNC, 0666)) == -1)
  132. # endif
  133. # ifndef OPEN3ARG
  134.     if ((fd = creat(p, 0666)) == -1)
  135. # endif
  136.        fprintf(stderr,"can't open: %s\n",p);
  137.  
  138.     start = (char *) &version;
  139.     end = sbrk(0);
  140.     length = end - start;
  141.  
  142.     write(fd, &version, sizeof(int));
  143.     write(fd, &start, sizeof(char *));
  144.     write(fd, &length, sizeof(unsigned int));
  145.  
  146.     for (len = 0; len < length; len += dlen) {
  147.     dlen = ((length - len) > 512) ? 512 : (length - len);
  148.     if (dlen != write(fd, start + len, dlen)) {
  149.         cant_happen(23);
  150.         }
  151.     }
  152.  
  153.     fprintf(stderr,"%u bytes written\n",len);
  154.  
  155.     close(fd);
  156. }
  157.  
  158. #endif /* AMIGA */
  159.  
  160. # ifdef ENVSAVE
  161. extern char **environ;
  162. # endif
  163.  
  164.  
  165. #ifdef AMIGA
  166.  
  167. doload(p) char *p;{
  168.     FILE *fd; 
  169.     char *start, *end, *brk(); 
  170.     unsigned int length, len; 
  171.     int dlen;
  172.     int test;
  173. # ifdef ENVSAVE
  174.     char **evsave;
  175. # endif
  176.  
  177.     if (!(fd = fopen(p, "rb")))
  178.     fprintf(stderr,"no such context as: %s\n", p);
  179.  
  180.     else {
  181.     fread(&test, sizeof(int), 1, fd);
  182.     fread(&start, sizeof(char *), 1, fd);
  183.     fread(&length, sizeof(unsigned int), 1, fd);
  184.  
  185.     if ((test != version) || (start != (char *) &version))
  186.         fprintf(stderr,"%s: not a valid context file for version %d\n", 
  187.                 p, version);
  188.     else {
  189.         start = (char *) &version;
  190.         end = brk(start + length + 1);
  191. # ifdef ENVSAVE
  192.         evsave = environ;
  193. # endif
  194.  
  195.             for (len = 0; len < length; len += dlen) {
  196.         dlen = ((length - len) > 512) ? 512 : (length - len);
  197.         if (dlen != fread(start + len, dlen, 1, fd)) {
  198.             cant_happen(23);
  199.             }
  200.         }
  201. # ifdef ENVSAVE
  202.        environ = evsave;
  203. # endif
  204.         fprintf(stderr,"%u bytes read\n",len);
  205.     }
  206.     fclose(fd);
  207.     }
  208. }
  209.  
  210. #else /* AMIGA */
  211.  
  212. doload(p) char *p;{
  213.     int fd; 
  214.     char *start, *end, *brk(); 
  215.     unsigned int length, len; 
  216.     int dlen;
  217.     int test;
  218. # ifdef ENVSAVE
  219.     char **evsave;
  220. # endif
  221.  
  222. # ifdef OPEN3ARG
  223.     if ((fd = open(p, O_RDONLY, 0)) == -1)
  224. # endif
  225. # ifndef OPEN3ARG
  226.     if ((fd = open(p, 0 )) == -1)
  227. # endif
  228.     fprintf(stderr,"no such context as: %s\n", p);
  229.  
  230.     else {
  231.     read(fd, &test, sizeof(int));
  232.     read(fd, &start, sizeof(char *));
  233.     read(fd, &length, sizeof(unsigned int));
  234.  
  235.     if ((test != version) || (start != (char *) &version))
  236.         fprintf(stderr,"%s: not a valid context file for version %d\n", 
  237.                 p, version);
  238.     else {
  239.         start = (char *) &version;
  240.         end = brk(start + length + 1);
  241. # ifdef ENVSAVE
  242.         evsave = environ;
  243. # endif
  244.  
  245.             for (len = 0; len < length; len += dlen) {
  246.         dlen = ((length - len) > 512) ? 512 : (length - len);
  247.         if (dlen != read(fd, start + len, dlen)) {
  248.             cant_happen(23);
  249.             }
  250.         }
  251. # ifdef ENVSAVE
  252.        environ = evsave;
  253. # endif
  254.         fprintf(stderr,"%u bytes read\n",len);
  255.     }
  256.     close(fd);
  257.     }
  258. }
  259.  
  260. #endif /* AMIGA */
  261.  
  262. /* lexread - read commands from a file */
  263. lexread(name)
  264. char *name;
  265. {    FILE *fd;
  266.  
  267.     fd = fopen(name, "r");
  268.     if (fd == NULL) {
  269.         fprintf(stderr,"can't open %s\n", name);
  270.         }
  271.     else {
  272.         set_file(fd);
  273.         }
  274. }
  275.  
  276. /* lexinclude - parse a class and include the class description */
  277. lexinclude(name)
  278. char *name;
  279. {  char template[60], cmdbuf[120];
  280.    int  i;
  281.  
  282. # ifndef NOSYSTEM
  283.    gettemp(template);
  284.    sprintf(cmdbuf,"%s %s %s", PARSER, name, template); /* WMK removed > */
  285.    i = system(cmdbuf);
  286. /* printf("%s = %d\n", cmdbuf, i); */
  287.    if (i == 0)
  288.        lexread(template);
  289. # endif
  290. # ifdef NOSYSTEM
  291.    fprintf(stderr,")i does not work on this system\n");
  292. # endif
  293. }
  294.  
  295. /* lexedit - edit a class description */
  296. int lexedit(name)
  297. char *name;
  298. {    char *e, buffer[100], *getenv();
  299.  
  300. # ifndef NOSYSTEM
  301.     e = getenv("EDITOR");
  302.     if (!e) e = "ed";
  303.     sprintf(buffer,"%s %s", e, name);
  304.     return(system(buffer));
  305. # endif
  306. # ifdef NOSYSTEM
  307.     fprintf(stderr,")e does not work on this system\n");
  308.     return(1);
  309. # endif
  310. }
  311.  
  312. char *brk(addr) {return (addr);}
  313.  
  314. void *malloc();
  315.  
  316. char *sbrk(incr) {return (malloc(incr));}
  317.